package com.wwz.leetcode;

import com.wwz.common.ListNode;
import org.junit.Test;

/**
 * @Description: 给你一个链表的头节点 head ，旋转链表，将链表每个节点向右移动 k 个位置。
 * @create: 2022-01-17 17:59:05
 * @author:wwz
 */
public class LeetCode61 {


    //  超时了 换下一个方法
    public ListNode rotateRight2(ListNode listNode, int k) {

        if (k == 0 || listNode == null || listNode.next == null) {
            return listNode;
        }

        // 尾巴
        ListNode tail = listNode;
        // 尾巴2
        ListNode tail2 = listNode;
        ListNode head = listNode;
        for (int i = 0; i < k; i++) {
            while (tail.next != null) {
                if (tail.next != null) {
                    tail2 = tail;
                    tail = tail.next;
                }
            }
            // 头插
            tail.next = head;
            tail2.next = null;
            // 头指针向前移动
            head = tail;
            // 指针归位
            tail = head;
        }
        return head;

    }

    public ListNode rotateRight(ListNode listNode, int k) {

        if (k == 0 || listNode == null || listNode.next == null) {
            return listNode;
        }

        // 尾巴
        ListNode tail = listNode;
        // 尾巴2
        ListNode tail2 = listNode;
        ListNode head = listNode;
        // 链表长度
        int length = 0;
        while (tail.next != null) {
            tail = tail.next;
            length++;
        }
        length++;

        if (length > k) {
            // 尾巴
            tail = listNode;
            // 尾巴2
            tail2 = listNode;
            for (int i = 0; i < k; i++) {
                while (tail.next != null) {
                    if (tail.next != null) {
                        tail2 = tail;
                        tail = tail.next;
                    }
                }
                // 头插
                tail.next = head;
                tail2.next = null;
                // 头指针向前移动
                head = tail;
                // 指针归位
                tail = head;
            }
            return head;
        } else {
            int remainder = k % length;
            // 尾巴
            tail = listNode;
            // 尾巴2
            tail2 = listNode;
            for (int i = 0; i < remainder; i++) {
                while (tail.next != null) {
                    if (tail.next != null) {
                        tail2 = tail;
                        tail = tail.next;
                    }
                }
                // 头插
                tail.next = head;
                tail2.next = null;
                // 头指针向前移动
                head = tail;
                // 指针归位
                tail = head;
            }
            return head;
        }
    }

    @Test
    public void test() {
//        ListNode listNode5 = new ListNode(5, null);
//        ListNode listNode4 = new ListNode(4, listNode5);
//        ListNode listNode3 = new ListNode(3, listNode4);
//        ListNode listNode2 = new ListNode(2, listNode3);
//        ListNode listNode1 = new ListNode(1, listNode2);

        //ListNode listNode4 = new ListNode(4, null);
        ListNode listNode3 = new ListNode(2, null);
        ListNode listNode2 = new ListNode(1, listNode3);
        ListNode listNode1 = new ListNode(0, listNode2);

        ListNode listNode = rotateRight(listNode1, 4);
        while (listNode != null) {
            System.out.println(listNode.val);
            listNode = listNode.next;
        }
    }
}
